package com.xiaoyu.string;

import java.util.HashMap;
import java.util.Stack;

/**
 * @program: DS_and_A
 * @description:
 * 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串 s ，判断字符串是否有效。
 *
 * 有效字符串需满足：
 *
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 *
 * @author: YuWenYi
 * @create: 2021-04-24 11:05
 **/

/*//失败的答案:无法解决-->"(([]){})" / "}{" 等情况
    private static HashMap<Character, Character> map = new HashMap<>();
    static {
        map.put('(',')');
        map.put('[',']');
        map.put('{','}');
    }
    public boolean isValid(String s) {
        if (s.length() % 2 != 0)
            return false;
        String left = s.substring(0,s.length()/2);
        String right = s.substring(s.length()/2);

        int i = 0;
        int j = right.length()-1;
        while (i <= left.length()-1){
            if (map.get(left.charAt(i)) == right.charAt(j)){
                i++;
                j--;
            }else if (i == left.length()-1 ){
                return map.get(left.charAt(i)) == right.charAt(0);
            }else if (map.get(left.charAt(i)) == left.charAt(i+1)){
                i+=2;
                if (map.get(right.charAt(j-1)) == right.charAt(j)){
                    j-=2;
                }else {
                    return false;
                }
            }else {
                return false;
            }
        }
        return true;
    }
 */

public class BracketIsValid {
    //别人的代码1:消消乐,消除法
   /* public boolean isValid(String s) {
        while(s.contains("()")||s.contains("[]")||s.contains("{}")){
            if(s.contains("()")){
                s=s.replace("()","");
            }
            if(s.contains("{}")){
                s=s.replace("{}","");
            }
            if(s.contains("[]")){
                s=s.replace("[]","");
            }
        }
        return s.length()==0;
    }*/
    private static HashMap<Character, Character> map = new HashMap<>();
    static {
        map.put(')','(');
        map.put(']','[');
        map.put('}','{');
    }
    //代码2,这道题是括号匹配对消,它和栈的后进先出是一模一样的!,因此标准答案应该是用栈来完成!
    public boolean isValid(String s) {
        if (s.length() % 2 != 0)
            return false;

        Stack<Character> stack = new Stack<>();  //用来存左括号
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{'){
                stack.push(s.charAt(i));
            }else {
                if (stack.isEmpty() || stack.peek() != map.get(s.charAt(i))) {
                    return false;
                }
                stack.pop();
            }
        }
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        BracketIsValid biv = new BracketIsValid();
        String s = "{[)}";   //true  "([)]"-->false
        boolean valid = biv.isValid(s);
        System.out.println("valid--->"+valid);
    }
}
